/*************************************************************************
                           MapGrid  -  description
                             -------------------
    début                : 9/02/2012
    copyright            : (C) 2012 par francois
*************************************************************************/

//---------- Interface de la classe MapGrid (fichier MapGrid.h) ------
#ifndef MAPGRID_H_
#define MAPGRID_H_

//--------------------------------------------------- Interfaces utilisées
#include <vector>
#include <list>

namespace livia {
//------------------------------------------------------------- Constantes

//------------------------------------------------------------------ Types
enum GRID
// Enumération des valeurs possibles pour une MapGrid
{
	NOT_VIEWED, VIEWED, OBSTACLE
};

typedef struct
{
	GRID grid;
	bool crossable;
}GridElem ;

typedef struct
{
	unsigned int x;
	unsigned int y;
	GridElem val;
}XYGrid;

// Modifications uniquement

typedef struct
{
	unsigned int x;
	unsigned int y;
	GRID grid;
}GridView;

typedef struct
{
	unsigned int x;
	unsigned int y;
	bool crossable;
}GridCrossable;

typedef std::vector<XYGrid> XYGridList;

//------------------------------------------------------------------------
// Rôle de la classe MapGrid
//
// Cette classe permet de modéliser le quadrillage du terrain.
//------------------------------------------------------------------------
class MapGrid {

//----------------------------------------------------------------- PUBLIC
public:

//----------------------------------------------------- Méthodes publiques
	double getScale() const { return scale; }
	// Retourne l'échelle utilisée

	unsigned int getWidth() const { return width; }
	// Retourne la largeur utilisée

	unsigned int getHeight() const { return height; }
	// Retourne la hauteur utilisée

	GridElem& get (unsigned int x, unsigned int y);
	// Retourne la valeur contenue dans la case (x,y)
	//
	// Contrat: x doit être strictement inférieur à width et y strictement
	// inférieur à height

	void set (XYGridList modifs);
	// Ajoute une liste de modification sur le quadrillage.
	//
	// Note: appelle notify() du pattern Observer

	void set(const std::vector<GridView>& modifs);
	void set(const std::vector<GridCrossable>& modifs);

//------------------------------------------------- Surcharge d'opérateurs

//-------------------------------------------- Constructeurs - destructeur
	MapGrid(unsigned int w, unsigned int h, double scale);
	// Constructeur: crée

	virtual ~MapGrid();
	// Destructeur

//------------------------------------------------------------------ PRIVE
private:

//----------------------------------------------------- Méthodes protégées


//----------------------------------------------------- Attributs protégés
	unsigned int width; // nombre de cases sur la largeur
	unsigned int height; // nombre de cases sur la hauteur
	double scale; // une case correspond à <scale> unités
	GridElem* data; // tableau de <width> x <height> éléments
};
//--------------------------- Autres définitions dépendantes de MapGrid

}

#endif // MAPGRID_H_
